Contents

import pandas as pd
import plotly.express as px
import seaborn as sns
import json
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import plotly.graph_objects as go

df_co2_per_capita = pd.read_csv('../data/co-emissions-per-capita.csv')
# Filteren van rijen waar de 'Code' kolom ontbrekende waarden heeft
missing_code_data = df_co2_per_capita[df_co2_per_capita['Code'].isnull()]

# Lijst van 'Entity' waarden zonder corresponderende 'Code'
entities_missing_code = missing_code_data['Entity'].unique()

# Output: alleen maar Continenten, geen landen. Dus deze rijen verwijderen uit de dataset.
# Filteren van de dataset om rijen te behouden waar 'Entity' niet in entities_missing_code zit
df_co2_per_capita_cleaned = df_co2_per_capita[~df_co2_per_capita['Entity'].isin(entities_missing_code)]
def check_chronological(df, entity_col='Entity', year_col='Year'):
    """
    Controleert of de rijen van elk land chronologisch zijn gesorteerd op basis van de kolom 'Year'.
    
    Parameters:
    df (pd.DataFrame): De DataFrame die gecontroleerd moet worden.
    entity_col (str): De naam van de kolom die de entiteiten (landen) bevat.
    year_col (str): De naam van de kolom die de jaren bevat.
    
    Returns:
    bool: True als alle rijen chronologisch zijn gesorteerd, anders False.
    dict: Een dictionary met niet-chronologische entiteiten en hun niet-chronologische jaren.
    """
    non_chronological_entities = {}

    for entity in df[entity_col].unique():
        entity_df = df[df[entity_col] == entity]
        if not entity_df[year_col].is_monotonic_increasing:
            non_chronological_entities[entity] = entity_df[year_col].tolist()
    
    if non_chronological_entities:
        return False, non_chronological_entities
    else:
        return True, {}

# Controleer of de DataFrame chronologisch is
is_chronological, non_chronological_entities = check_chronological(df_co2_per_capita_cleaned)

# if is_chronological:
#     print("Alle rijen zijn chronologisch gesorteerd.")
# else:
#     print("De volgende entiteiten hebben niet-chronologische jaren:")
#     for entity, years in non_chronological_entities.items():
#         print(f"{entity}: {years}")

# Output: Alle rijen zijn chronologisch gesorteerd.

# print(df_co2_per_capita_cleaned.isnull().sum())
import plotly.express as px
import pandas as pd

# Veronderstelling dat je de dataset correct hebt ingelezen als df_co2_per_capita_cleaned

# Zorg ervoor dat de jaren gesorteerd zijn
df_co2_per_capita_cleaned = df_co2_per_capita_cleaned.sort_values(by='Year')

# Maak de kaart met een slider voor de jaren
fig = px.choropleth(
    df_co2_per_capita_cleaned, 
    locations="Code", 
    color="Annual CO₂ emissions (per capita)", 
    hover_name="Entity", 
    animation_frame="Year",
    color_continuous_scale=px.colors.sequential.Plasma,  # Aangepaste kleurenschaal
    range_color=(0, 25),
    labels={'Annual CO₂ emissions (per capita)': 'CO₂ emissies per capita (ton)'},
    title='CO₂ emissie per capita wereldwijd'
)

# Aanpassingen aan de layout
fig.update_layout(
    geo=dict(
        showframe=True,
        showcoastlines=True,
        coastlinecolor="white",
        projection_type='natural earth',
        lakecolor="lightblue"
    ),
    width=900,  # Vergroot de breedte van de kaart
    height=700,  # Vergroot de hoogte van de kaart
    title={
        'text': "CO₂ Emissies per Capita Wereldwijd (1750-2022)",
        'y': 0.95,
        'x': 0.5,
        'xanchor': 'center',
        'yanchor': 'top',
        'font': {'size': 24}  # Grotere titel
    },
    coloraxis_colorbar=dict(
        title="CO₂ emissie per capita <br> (ton)",
        thicknessmode="pixels",
        thickness=30,
        lenmode="pixels",
        len=600,  # Langer maken van de colorbar
        orientation='h',  # Horizontale colorbar
        xanchor='center',
        x=0.5,
        y=-0.15,  # Plaatsing tussen slider en kaart
        ticks="outside",
        tickvals= [0, 5, 10, 15, 20], # Gebruik visueel gelijk verdeelde tickvals
        ticktext=["0 t", "5 t", "10 t", "15 t", "20 t"]  # De daadwerkelijke waarden
    )
)

fig.update_geos(
    lakecolor="lightblue",
    showcountries=False,
    countrycolor="black",
    coastlinecolor="white",
    lataxis_range=[-50, 90]  # Dit beperkt de zuidelijke breedtegraad tot -50
)

# Hover-data aanpassen
fig.update_traces(
    hovertemplate="<b>%{hovertext}</b><br>" +
                  "Jaar: %{frame}<br>" +
                  "CO₂ emissies per capita: %{z:.2f} ton<br>" +
                  "<extra></extra>"
)

# Unieke jaren verkrijgen voor de slider stappen
unique_years = df_co2_per_capita_cleaned['Year'].unique()
unique_years.sort()  # Zorg ervoor dat de jaren gesorteerd zijn

# Aangepaste slider
fig.update_layout(
    sliders=[{
        'active': 0,
        'yanchor': 'top',
        'xanchor': 'left',
        'currentvalue': {
            'font': {'size': 14},
            'prefix': 'Jaar:',
            'visible': True,
            'xanchor': 'right'
        },
        'transition': {'duration': 300, 'easing': 'linear'},  # Langzamer bewegen door jaren
        'pad': {'b': 10, 't': 50},
        'len': 0.9,
        'x': 0.07,
        'y': -0.2,  # Plaatsing van de slider lager om overlap te voorkomen
        'steps': [{
            'args': [[str(year)], {'frame': {'duration': 300, 'redraw': True},
                                   'mode': 'immediate',
                                   'transition': {'duration': 300}}],
            'label': str(year),
            'method': 'animate'
        } for year in unique_years]
    }]
)

# Toon de kaart
fig.show()